/**
 * Copyright (c) [2025] [何屹林]
 *
 * 保留所有权利。
 *
 * 文件名称：LR_0_DFAShow.h
 * 模块功能说明：
 * 该模块实现逻辑处理类中关于LR0的DFA图相关内容展示接口
 *
 * 华南师范大学-计算机学院-网络工程-1班
 * 作者：何屹林-20222132023
 * 完成日期：2025年7月24日
 */
#include "logic.h"

void Logic::lr0_DfaShow(const QString& title)
{
    Item first_item(start_sign,*grammars[start_sign].begin(),QSet<QString>({"$"}),0);   //初规则
    LR0_state first_state;                                                              //初状态
    first_state.st.insert(first_item);
    first_state=LR0_state::closure(first_state,grammars,nonFinalizers,first_set);

    LR0 lr0;                                                                            //lr0类
    lr0.state_hash[first_state] = lr0.size++;
    lr0.buildLR0(first_state, grammars, nonFinalizers, first_set, follow_set);

    QStringList header,colHeader;                                                       //表头、行头
    for(auto i:lr0.change_hash.keys())
        for(auto j:lr0.change_hash[i].keys())
            if(!header.contains(j)) header.append(j);

    for(int i=0;i<lr0.state_hash.size();i++) colHeader.append(QString::number(i));

    int row=colHeader.size();
    int col=header.size();
    QVector<QVector<QString>> contentTable(row,QVector<QString>(col));                  //内容表

    for(int i=0;i<lr0.state_hash.size();i++)
    {
        QStringList keys=header;
        for(int j=0;j<keys.size();j++)
            if(lr0.change_hash[i][keys[j]]!=0)
                contentTable[i][j]=QString::number(lr0.change_hash[i][keys[j]]);
    }

    formShow(title,header,colHeader,contentTable);
    return;
}
